package cn.iocoder.yudao.module.hs.netty;

import cn.hutool.extra.spring.SpringUtil;
import lombok.Data;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Data
public class RFIDData {

    /**
     * 用于存储RFID标签上报数据的基站ID
     */
    private String deviceId;

    /**
     * 用于存储RFID标签二维码字符串值
     */
    private String rfidCode;

    /**
     * 标签数据上报时间
     */
    private LocalDateTime reportTime;

    /**
     * 是否为低电量标签(1:是，0:否）
     */
    private Integer isLow;

    /**
     * 标签数据上报的距离值（暂未用到）
     */
    private Integer rssi;

    public static List<RFIDData> getLastRFIDList() {
        RedisTemplate redisTemplate = (RedisTemplate) SpringUtil.getApplicationContext().getBean("redisTemplate");
        ValueOperations<String, RFIDData> valueOps = redisTemplate.opsForValue();
        SetOperations<String, String> setOps = redisTemplate.opsForSet();
        
        // 获取 List 中的所有元素
        Set<String> values = setOps.members("LAST_RFID_LIST");
        List<RFIDData> rfidDataList = new ArrayList<>();
        
        if (values != null && !values.isEmpty()) {
            // 批量获取所有RFID数据
            List<RFIDData> dataList = valueOps.multiGet(values);
            
            // 同时检查哪些key已经过期
            List<String> expiredKeys = new ArrayList<>();
            for (int i = 0; i < dataList.size(); i++) {
                RFIDData data = dataList.get(i);
                if (data != null) {
                    rfidDataList.add(data);
                } else {
                    // 记录过期的key，稍后清理
                    expiredKeys.add((String) values.toArray()[i]);
                }
            }
            
            // 批量删除过期的key
            if (!expiredKeys.isEmpty()) {
                setOps.remove("LAST_RFID_LIST", expiredKeys.toArray());
            }
        }
        
        return rfidDataList;
    }

    public static RFIDData getRFIDData(String rfidCode) {
        List<RFIDData> lastRFIDList = getLastRFIDList();
        return lastRFIDList.stream().filter(rfidData -> rfidData.getRfidCode().equals(rfidCode)).findFirst().orElse(null);
    }
}